/**********************************************************************************************************
** 程序文件：	Database.h
** 程序版本：	1.0
** 开发环境：	RealView MDK-ARM 5.11
** 程序作者：	盖书永
** 修改日期：	2014年11月14日14:24:10
** 文件功能：	数据库管理
** 修改日志：	
**********************************************************************************************************/
#ifndef _DATABSSE_H_
#define _DATABSSE_H_

#define UART_WordLength_8b                  0
#define UART_WordLength_9b                  1

#define UART_StopBits_0_5                   0
#define UART_StopBits_1                     1
#define UART_StopBits_1_5                   2
#define UART_StopBits_2                     3

#define UART_Parity_No                      0
#define UART_Parity_Even                    1
#define UART_Parity_Odd                     2

//状态类型类型定义
typedef enum {
	Normal			= 0,									//正常
	Alarm			= 1,									//告警
	Unknown			= 2,									//未知
	Fault			= 3,									//故障
	ON				= 4,									//开
	OFF				= 5,									//关
	FILE_SYS_ERROR	= 6,									//设备初始化时，文件打开错误或者读取错误，可能文件不存在，或者其他 
	NOT_ENOUGH_MEM	= 7,									//设备初始化时，没有足够的动态内存
	CFG_JSON_ERROR	= 8,									//设备初始化时，配置文件JSON格式错误，或者内容错误
	Set1_Alarm		= 9,									//设定上限告警
	Set2_Alarm		= 10,									//设定下限告警
	NewSet			= 11									//新设置
} STATUS_Type;

//变量数据类型定义
typedef enum {
	Null 	= 0,			
	BOOLEAN = 1,											//布尔量
	INTEGER = 2,											//整型
	FLOAT 	= 3,											//浮点型
	OCTSTR 	= 4,											//字符串
	ENUM	= 5,											//枚举量	
	OBJ		= 6,											//对象
	STRUCT	= 7,											//结构体
	ARRAY	= 8												//数组
} DATA_Type;

//变量数据类型定义
typedef enum {
	READONLY  = 0,											//只读
	WRITEONLY = 1,											//只写
	READWRITE = 2											//读写
} RW_Type;

//触发器结构定义
typedef struct{ 
	float					set1;							//上限设定值	
	float					set2;							//下限设定值
} Trigger_Def;

//变量属性结构定义
typedef struct{		
	const DATA_Type			type;							//变量数据类型
	const unsigned int		len;							//变量空间大小
	const RW_Type			rw_type;						//变量读写类型	
	const char				*name;							//变量名称
	const char				*lable;							//变量标签	
	const char				*unit;							//变量单位
	const char				*desc;							//变量描述
	const unsigned char		trigger_en;						//触发器默认使能状态
	const unsigned char		actuator_en;					//执行器默认使能状态
	const char				*prompt1;						//上限触发默认提示
	const char				*prompt2;						//下限触发默认提示	
	const float				set1;							//上限设定默认值	
	const float				set2;							//下限设定默认值
	const float				min;							//变量最小值	
	const float				max;							//变量最大值
} Var_Property_Def;	

//变量结构定义
typedef struct{	
	union {
		const char			*str;
		int					inum;
		float				fnum;
	} value;
	char					*name;							//变量标签，默认为属性中的变量名称
	STATUS_Type				status;							//变量状态	
	STATUS_Type				old_status;						//用于记录上一次变量状态，2G网络发送数据是判断此状态和新状态（status）是否一致，如果一致将prompt值置空，不一致写入实际值。此做法是为了压缩上传的字节数减少流量	
	unsigned int			timestamp;						//记录读写变量设置状态的变化时间戳
	char					*prompt;						//变量状态提示
	Trigger_Def				*trigger;						//触发器表指针;
	const Var_Property_Def	*property;						//设备变量属性
} Var;

/**********************************************************************************************************
* 函数名称： DeviceDriverRegistration
* 函数说明： 设备驱动进行注册,默认串口配置为8数据位1停止位无校验（推荐此方法注册驱动）
* 输入参数： 
* 返回参数： 无
**********************************************************************************************************/
void DeviceDriverRegistration(
	 const char				*type,							//设备类型字符串指针
	 const char    	  		*name,							//设备名称字符串指针
	 const char				*brand,							//设备品牌字符串指针
	 const char				*model,							//设备型号字符串指针
	 const char    	  		*desc,							//设备描述字符串指针
	 const Var_Property_Def *var_property,					//变量属性结构 
	 unsigned short	 		var_struct_size,				//变量结构体空间大小
	 void (*cmd_func  )(short, int, void*, char *, short*),	//发送指令生成函数
	 int  (*parse_func)(short, int, void* ,char *, short ),	//数据解析函数
	 unsigned short			res_timeout						//响应超时时间	
);

/**********************************************************************************************************
* 函数名称： DeviceDriverRegistrationV1
* 函数说明： 设备驱动进行注册,带有品牌指定、超时返回、串口数据位停止位奇偶校验位配置
* 输入参数： 
* 返回参数： 无
**********************************************************************************************************/
void DeviceDriverRegistrationV1(
	const char				*type,							//设备类型字符串指针
	const char    	  		*name,							//设备名称字符串指针
	const char				*brand,							//设备品牌字符串指针
	const char				*model,							//设备型号字符串指针
	const char    	  		*desc,							//设备描述字符串指针
	const Var_Property_Def *var_property,					//变量属性结构 
	unsigned short	 		var_struct_size,				//变量结构体空间大小
	void (*cmd_func  )(short, int, void*, char *, short*),	//发送指令生成函数
	int  (*parse_func)(short, int, void* ,char *, short ),	//数据解析函数
	unsigned short			res_timeout,					//响应超时时间		
	unsigned char			word_length,					//串口数据位长度	
	unsigned char			stop_bits,						//串口停止位个数	
	unsigned char			parity							//串口奇偶校验位
);	
						 
/**********************************************************************************************************
* 函数名称： Device_Registration
* 函数说明： 设备进行注册,响应超时时间默认250ms
* 输入参数： 
* 返回参数： 无
**********************************************************************************************************/
void Device_Registration(
	const char				*type,							//设备类型字符串指针
	const char    	  		*name,							//设备名称字符串指针
	const char				*model,							//设备型号字符串指针
	const char    	  		*desc,							//设备描述字符串指针
	const Var_Property_Def *var_property,					//变量属性结构 
	unsigned short	 		var_struct_size,				//变量结构体空间大小
	void (*cmd_func  )(short, int, void*, char *, short*),	//发送指令生成函数
	int  (*parse_func)(short, int, void* ,char *, short )	//数据帧解析函数
);	

/**********************************************************************************************************
* 函数名称： DeviceRegWithResTimeout
* 函数说明： 设备进行注册，带有响应时间超时参数
* 输入参数： 
* 返回参数： 无
**********************************************************************************************************/
void DeviceRegWithResTimeout(
	const char				*type,							//设备类型字符串指针
	const char    	  		*name,							//设备名称字符串指针
	const char				*model,							//设备型号字符串指针
	const char    	  		*desc,							//设备描述字符串指针
	const Var_Property_Def *var_property,					//变量属性结构 
	unsigned short	 		var_struct_size,				//变量结构体空间大小
	void (*cmd_func  )(short, int, void*, char *, short*),	//发送指令生成函数
	int  (*parse_func)(short, int, void* ,char *, short ),	//数据解析函数
	unsigned short			res_timeout						//响应超时时间		
);
	
/**********************************************************************************************************
* 函数名称： void VirtualFrameRegistration(const char *cmd, short cmdlen, const char *rsp, short rsplen)
* 函数说明： 虚拟数据帧注册
* 输入参数： 设备指令帧，设备指令帧长度，设备返回数据帧，设备返回数据帧长度
* 返回参数： 无
**********************************************************************************************************/
void VirtualFrameRegistration(const char *cmd, short cmdlen, const char *rsp, short rsplen);

/**********************************************************************************************************
* 函数名称： void Set_Var_Status(Var *var, STATUS_Type status, const char *prompt)
* 函数说明： 设置变量状态
* 输入参数： 变量指针，状态，提示信息
* 返回参数： 无
**********************************************************************************************************/
void Set_Var_Status(Var *var, STATUS_Type status, const char *prompt);
	
/**********************************************************************************************************
* 函数名称： void SetDataPointStatus(Var *var, STATUS_Type status, const char *prompt)
* 函数说明： 设置数据点状态
* 输入参数： 变量指针，状态，提示信息
* 返回参数： 无
**********************************************************************************************************/
void SetDataPointStatus(Var *var, STATUS_Type status, const char *prompt);

/**********************************************************************************************************
* 函数名称： void SetStringDataPoint(Var *var, int flag, STATUS_Type tureSta, STATUS_Type falseSta, const char *tureStr, const char *falseStr)
* 函数说明： 设置字符串数据点值和状态
* 输入参数： 变量指针，判断标识flag，flag为真状态，flag为假状态，flag为真字符串值，flag为假字符串值，
* 返回参数： 无
**********************************************************************************************************/
void SetStringDataPoint(Var *var, int flag, STATUS_Type tureSta, STATUS_Type falseSta, const char *tureStr, const char *falseStr);

#endif
